package a00_LeetCode.Stack;

/**
 * @Author quan
 * @Description 逆波兰表达式求值
 * 给你一个字符串数组 tokens ，表示一个根据 逆波兰表示法 表示的算术表达式。
 * 请你计算该表达式。返回一个表示表达式值的整数
 * @Date 2023/3/22 16:17
 */

import java.util.Stack;

/**
 * 输入：tokens = ["2","1","+","3","*"]
 * 输出：9
 * 解释：该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
 */
public class Num150_evalPRN {
    public int evalRPN(String[] tokens) {
        //创建一个栈
        Stack<Integer> stack = new Stack<>();
        //遍历字符串
        for (String str : tokens) {
            //判断当前字符串是数字还是运算符号
            if(isNum(str)){
                //是数字，就将该字符串类型的数字转为整型数字压入栈
                stack.push(Integer.parseInt(str));
            }else{//说明是运算符，此时判断是哪种运算符
                //此时从栈中连续弹出两个值
                int num1 = stack.pop();
                int num2 = stack.pop();
                int result = 0;
                switch (str) {
                    case "+":
                        result = num2+num1;
                        break;
                    case "-":
                        result = num2-num1;
                        break;
                    case "*":
                        result = num2*num1;
                        break;
                    case "/":
                        result = num2/num1;
                        break;
                }
                //将计算出来的最新的值压入栈中，等待下一次计算
                stack.push(result);
            }
        }
        //当整个字符串遍历结束，栈顶的元素值就是最终计算结果
        return stack.peek();
    }
    /**
     * 判断当前字符串是数字还是运算符号
     * 尝试执行字符串转整型操作，不报错就返回true，否则catch返回false
     */
    private boolean isNum(String str) {
        try{
            Integer.parseInt(str);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}
